package com.zw.a.basic.a13.demo02_runnable;

//案例: 演示多线程的实现方式二: 实现Runnable接口.
/*
    多线程的实现方式:
        方式一:  继承Thread类.

        方式二: 实现Runnable接口.
            1. 定义一个类(MyRunnable), 实现Runnable接口
            2. 重写Runnable#run()方法.
            3. 把要执行的代码放到run()方法中.
            4. 创建Runnable接口的子类对象, 并将其作为参数传递给Thread类, 创建线程对象.
            5. 开启线程.

        方式三: 实现Callable接口.
            需要结合线程池使用.

    开启线程的两个细节:
        1. 开启线程调用的是Thread#start()方法.
        2. 同一线程不能重复开启, 否则会报 IllegalThreadStateException(非法的线程状态异常).

    结论: 记忆
        多线程的执行具有随机性和延迟性, 原因是因为CPU在做着高效的切换.
 */
public class Demo01 {
    public static void main(String[] args) {
        //4. 创建Runnable接口的子类对象, 并将其作为参数传递给Thread类, 创建线程对象.
        //4.1 创建Runnable接口的子类对象
        MyRunnable mr = new MyRunnable();
        //4.2 并将其作为参数传递给Thread类, 创建线程对象.
        Thread th = new Thread(mr);

        //Lambda表达式版本实现.
        /*Thread th = new Thread(() -> {
            //3. 把要执行的代码放到run()方法中.
            for (int i = 0; i < 100; i++) {
                System.out.println("run...................." + i);
            }
        });*/
        //5. 开启线程.
        th.start();

        //需求1: 打印100次 main
        for (int i = 0; i < 100; i++) {
            System.out.println("main..." + i);
        }
    }
}
